home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 11 / CU Amiga Magazine's Super CD-ROM 11 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-06].iso / cucd / programming / oberonv4 / source / system / amiganetbase.mod (.txt) < prev    next >
Oberon Text  |  1996-07-28  |  9KB  |  272 lines

  1. Syntax20b.Scn.Fnt
  2. ParcElems
  3. Alloc
  4. Syntax24b.Scn.Fnt
  5. Syntax10.Scn.Fnt
  6. Syntax10b.Scn.Fnt
  7. (* AMIGA *)
  8. MODULE AmigaNetBase; (** 13.2.96 BD, 1996-07-15 RD *)
  9. IMPORT SYSTEM, B:=AmigaBSD, AmigaExec;
  10. CONST
  11.     AddressLength* = 4;
  12.     INADDRNONE* = 00000000H;
  13. (*domain*)
  14.         AFINET* = 2;
  15.         PFINET* = AFINET;
  16. (*socket()*)
  17.     (* types of connection*)
  18.         SOCKSTREAM* = 1;
  19.         SOCKDGRAM* = 2;
  20.     (*Protocols *)
  21.         IPPROTOUDP* = 17;
  22.         IPPROTOTCP* = 6;
  23. (*listen() *)
  24.         backlog = 5;    (* max number of pending connection *)
  25. (*setsockopt() *)
  26.         SOLSOCKET = 0FFFFH;    (*socket option level *)
  27.         SOLINGER = 80H;    (* linger (gracefully close the connection)*)
  28. (*ioctl() *)
  29.         FIONREAD = 4004667FH;    (* something to read ? *) (* 4000667FH ??? *)
  30. (*select() *)
  31.         FDSETSIZE = 64;    (* number of socket file descriptors in struct fd-set for the select system call *)
  32.     TYPE
  33.         IPAdr* = ARRAY AddressLength OF CHAR;
  34.         Data* = ARRAY OF SYSTEM.BYTE;
  35.         Sockaddrin*= RECORD
  36.             sinfamily*: INTEGER;
  37.             sinport*: INTEGER;
  38.             sinaddr*: IPAdr;
  39.             sinzero*: ARRAY 8 OF CHAR
  40.         END;
  41.         struct in_addr {
  42.           u_long s_addr;
  43.         struct sockaddr_in {
  44.           u_char  sin_len;
  45.           u_char  sin_family;
  46.           u_short sin_port;
  47.           struct  in_addr sin_addr;
  48.           char    sin_zero[8];
  49.         hostent= POINTER TO hostentdesc;
  50.         hostentdesc= RECORD
  51.             hname: LONGINT;
  52.             haliases: LONGINT;
  53.             haddrtype: LONGINT;
  54.             hlength: LONGINT;
  55.             haddrlist: LONGINT
  56.         END;
  57.         linger = RECORD    (* int ?!?!? *)
  58.             lonoff: LONGINT;
  59.             llinger: LONGINT
  60.         END;
  61.         struct  linger {
  62.             int     l_onoff;                /* option on/off */
  63.             int     l_linger;               /* linger time */
  64.         Timeval = RECORD
  65.             tvsec, tvusec: LONGINT
  66.         END;
  67.         FdSet = ARRAY (FDSETSIZE DIV SIZE(LONGINT)) OF LONGINT;
  68.     done*, started*: BOOLEAN;
  69.     PROCEDURE Accept*(s: LONGINT; VAR newsocket(*out*): LONGINT);
  70.     BEGIN
  71.         newsocket:= B.accept(s, 0, 0);
  72.         IF newsocket > 0 THEN done:= TRUE ELSE done:= FALSE END
  73.     END Accept;
  74.     PROCEDURE Bind*(s: LONGINT; VAR sockaddr(*in*): Sockaddrin);
  75.         VAR err: LONGINT;
  76.     BEGIN
  77.         err:= B.bind(s, SYSTEM.ADR(sockaddr), SIZE(Sockaddrin));
  78.         IF err = 0 THEN done:= TRUE ELSE done:= FALSE END
  79.     END Bind;
  80.     PROCEDURE Close*(s: LONGINT);
  81.         VAR err: LONGINT;
  82.     BEGIN
  83.         err:= B.close(s);
  84.         IF err = 0 THEN done:= TRUE ELSE done:= FALSE END
  85.     END Close;
  86.     PROCEDURE Connect*(s: LONGINT; VAR sockaddr(*in*): Sockaddrin);
  87.         VAR err: LONGINT;
  88.     BEGIN
  89.         err:= B.connect(s, SYSTEM.ADR(sockaddr), SIZE(Sockaddrin));
  90.         IF err= 0 THEN done:= TRUE ELSE done:= FALSE END
  91.     END Connect;
  92.     PROCEDURE GetHostByAdr* (adr: IPAdr; VAR name(*out*): ARRAY OF CHAR);
  93.         VAR hostentPtr: hostent;
  94.             err, namePtr, i: LONGINT;
  95.             ch: CHAR;
  96.     BEGIN
  97.         err:= B.gethostbyaddr(SYSTEM.ADR(adr), AddressLength, PFINET);        (* adr : internet adress *)
  98.         IF err # 0 THEN                                        (* err points to struct hostent *)
  99.             hostentPtr:= SYSTEM.VAL(hostent, err);
  100.             SYSTEM.GET(hostentPtr.hname, namePtr);
  101.             i:= 0;
  102.             REPEAT                                            (* char  * namePtr -> ARRAY OF CHAR *)
  103.                 SYSTEM.GET(namePtr+i, ch);
  104.                 name[i]:= ch
  105.             UNTIL (ch = 0X) OR (ch = 0DX);
  106.             done:= TRUE
  107.         ELSE done:= FALSE
  108.         END
  109.     END GetHostByAdr;
  110.     PROCEDURE GetHostByName* (name: ARRAY OF CHAR; VAR addr(*out*): IPAdr);
  111.         VAR hostentPtr: hostent;
  112.             err, adr, haddrlist, firstaddrPtr: LONGINT;
  113.     BEGIN
  114.         err:= B.gethostbyname(SYSTEM.ADR(name));
  115.         IF err # 0 THEN                                                        (* err points to struct hostent *)
  116.             hostentPtr:= SYSTEM.VAL(hostent, err);
  117.             SYSTEM.GET(hostentPtr.haddrlist, firstaddrPtr);
  118.             SYSTEM.GET(firstaddrPtr, adr);
  119.             SYSTEM.MOVE(SYSTEM.ADR(adr), SYSTEM.ADR(addr), LEN(addr));
  120.             done:= TRUE
  121.         ELSE done:= FALSE
  122.         END
  123.     END GetHostByName;
  124.     PROCEDURE GetHostByIP* (VAR IPadr(*in*): ARRAY OF CHAR; VAR addr(*out*): IPAdr);
  125.         VAR adr: LONGINT;
  126.     BEGIN
  127.         adr:= B.inetaddr(SYSTEM.ADR(IPadr));        (* dotted-decimal number -> internet address *)
  128.         IF adr # INADDRNONE THEN
  129.             SYSTEM.MOVE(SYSTEM.ADR(adr), SYSTEM.ADR(addr), LEN(addr));
  130.             done:= TRUE
  131.         ELSE done:= FALSE
  132.         END
  133.     END GetHostByIP;
  134.     PROCEDURE GetHostName* (VAR name(*out*): ARRAY OF CHAR);
  135.         VAR err: LONGINT;
  136.     BEGIN
  137.         err:= B.gethostname(SYSTEM.ADR(name), LEN(name));
  138.         IF err=0 THEN done:= TRUE ELSE done:= FALSE END
  139.     END GetHostName;
  140.     PROCEDURE GetPeerName*(s: LONGINT; VAR adr(*out*): Sockaddrin);
  141.         VAR err, len: LONGINT;
  142.     BEGIN
  143.         len:= SIZE(Sockaddrin);
  144.         err:= B.getpeername(s, SYSTEM.ADR(adr), SYSTEM.ADR(len));
  145.         IF err = 0 THEN done:= TRUE ELSE done:= FALSE END
  146.     END GetPeerName;
  147.     PROCEDURE Listen*(s: LONGINT);
  148.         VAR err: LONGINT;
  149.     BEGIN
  150.         err:= B.listen(s, backlog);
  151.         IF err = 0 THEN done:= TRUE ELSE done:= FALSE END
  152.     END Listen;
  153.     PROCEDURE Recv*(s: LONGINT; VAR buf(*out*): ARRAY OF SYSTEM.BYTE; pos: LONGINT; VAR len(*inout*): LONGINT);
  154.         VAR err: LONGINT;
  155.     BEGIN
  156.         ASSERT((LEN(buf)-pos) >= len);
  157.         err:= B.recv(s, SYSTEM.ADR(buf[pos]), len, 0);
  158.         IF err >= 0 THEN len:= err; done:= TRUE ELSE len:= 0; done:= FALSE END
  159.     END Recv;
  160.     PROCEDURE RecvFrom*(s: LONGINT; VAR from: Sockaddrin; VAR buf(*out*): Data; pos: LONGINT; VAR len(*inout*): LONGINT);
  161.         VAR err, size: LONGINT;
  162.     BEGIN
  163.         ASSERT((LEN(buf)-pos) >= len);
  164.         size:= SIZE(Sockaddrin);
  165.         err:= B.recvfrom(s, SYSTEM.ADR(buf[pos]), len, 0, SYSTEM.ADR(from), SYSTEM.ADR(size));
  166.         IF err >= 0 THEN len:= err; done:= TRUE ELSE len:= 0; done:= FALSE END
  167.     END RecvFrom;
  168.     PROCEDURE Send*(s: LONGINT; VAR buf(*in*): Data; pos: LONGINT; VAR len(*inout*): LONGINT);
  169.         VAR err: LONGINT;
  170.     BEGIN
  171.         ASSERT((LEN(buf)-pos) >= len);
  172.         err:= B.send(s, SYSTEM.ADR(buf[pos]), len, 0);
  173.         IF err >= 0 THEN len:= err; done:= TRUE ELSE len:= 0; done:= FALSE END
  174.     END Send;
  175.     PROCEDURE SendTo*(s: LONGINT; to: Sockaddrin; VAR buf(*in*): Data; pos, len: LONGINT);
  176.         VAR err: LONGINT;
  177.     BEGIN
  178.         ASSERT((LEN(buf)-pos) >= len);
  179.         err:= B.sendto(s, SYSTEM.ADR(buf[pos]), len, 0, SYSTEM.ADR(to), SIZE(Sockaddrin));
  180.         IF err >= 0 THEN len:= err; done:= TRUE ELSE len:= 0; done:= FALSE END
  181.     END SendTo;
  182.     PROCEDURE Socket* (VAR s(*out*): LONGINT; af, type, protocol: LONGINT);
  183.     BEGIN
  184.         s:= B.socket(af, type, protocol);
  185.         IF s > 0 THEN done:= TRUE ELSE done:= FALSE END
  186.     END Socket;
  187.     PROCEDURE Available*(s: LONGINT): LONGINT;
  188.         VAR available, err: LONGINT;
  189.     BEGIN
  190.         err:= B.ioctl(s, FIONREAD, SYSTEM.ADR(available));
  191.         IF err = 0 THEN done:= TRUE; RETURN available
  192.         ELSE done:= FALSE; RETURN -1
  193.         END
  194.     END Available;
  195.     PROCEDURE Requested*(s: LONGINT): BOOLEAN;
  196.         VAR err, res, i: LONGINT;
  197.             readfds: FdSet;
  198.             timeout: Timeval;
  199.     BEGIN
  200.         timeout.tvsec:= 0; timeout.tvusec:= 0;
  201.         FOR i:= 0 TO 31 DO readfds[i]:=0 END;
  202.         readfds[s DIV 32]:= SYSTEM.LSH(1, s MOD 32);
  203.         err:= B.select(s+1, SYSTEM.ADR(readfds), 0, 0, SYSTEM.ADR(timeout));
  204.         IF err = -1 THEN done:= FALSE ELSE done:= TRUE END;
  205.         RETURN err > 0
  206.     END Requested;
  207.     PROCEDURE Connected*(s: LONGINT): BOOLEAN;
  208.         VAR err, available: LONGINT;
  209.     BEGIN
  210.         IF Requested(s) THEN RETURN Available(s) > 0
  211.         ELSE RETURN TRUE
  212.         END
  213.     END Connected;
  214.     PROCEDURE SetLinger* (s: LONGINT);
  215.         VAR l: linger;
  216.             err, size: LONGINT;
  217.     BEGIN
  218.         l.lonoff:= 1;
  219.         l.llinger:= 1;
  220.         err:= B.setsockopt(s, SOLSOCKET, SOLINGER, SYSTEM.ADR(l), SIZE(linger));
  221.         IF err = 0 THEN done:= TRUE ELSE done:= FALSE END
  222.     END SetLinger;
  223.     PROCEDURE NetToInt* (x: INTEGER): INTEGER;
  224.     BEGIN
  225.         done:= TRUE;
  226.         RETURN x
  227.     END NetToInt;
  228.     PROCEDURE IntToNet* (x: INTEGER): INTEGER;
  229.     BEGIN
  230.         done:= TRUE;
  231.         RETURN x
  232.     END IntToNet;
  233.     PROCEDURE NetToLInt* (x: LONGINT): LONGINT;
  234.     BEGIN
  235.         done:= TRUE;
  236.         RETURN x
  237.     END NetToLInt;
  238.     PROCEDURE LIntToNet* (x: LONGINT): LONGINT;
  239.     BEGIN
  240.         done:= TRUE;
  241.         RETURN x
  242.     END LIntToNet;
  243.     PROCEDURE Start*;
  244.     BEGIN
  245.         IF ~started THEN
  246.             B.OpenLib();
  247.             IF B.bsdBase#0 THEN
  248.                 done:=TRUE;
  249.                 started:=TRUE
  250.             ELSE
  251.                 done:=FALSE;
  252.                 started:=FALSE
  253.             END
  254.         END
  255.     END Start;
  256.     PROCEDURE Stop*;
  257.     BEGIN
  258.         IF started THEN
  259.             B.CloseLib();
  260.             done:=TRUE;
  261.             started:=FALSE
  262.         END
  263.     END Stop;
  264.     PROCEDURE Init;
  265.     BEGIN
  266.         done:=FALSE;
  267.         started:=FALSE
  268.     END Init;
  269. BEGIN
  270.     Init
  271. END AmigaNetBase.
  272.